/*
 * Section.cpp
 *
 *  Created on: 6 mars 2011
 *      Author: Julien
 */

#include "Section.h"
#include "Element.h"
#include "Station.h"
#include "Rails.h"
#include "LigneTramway.h"
#include "FeuSignalisationTramway.h"

Section::Section(int taille) {
	this->taille = taille;
	this->ligne = new Element*[taille];
	// Par défaut, on considère que la section est uniquement constituée de Rails
	int i;
	for(i=0; i<this->taille; i++){
		Rails* r = new Rails(this);
		this->ligne[i] = r;
	}
	for(i=0; i<this->taille; i++){
		(this->ligne[i])->setNumero(i);
	}
	cout << "*** Section créée de taille " << taille << " ***" << endl;
}

void Section::afficher_feuxSection(){
	if (this->feuSignalisationTramway != NULL)
	{
		if (this->feuSignalisationTramway->passageEstAutorise())
		{
	        couleur_lettre("32");
	        cout << "*";
	        couleur_lettre("0");
	        //cout << endl;
		}else
		{
			couleur_lettre("31");
			cout << "*";
			couleur_lettre("0");
			//cout << endl;
		}
	}
	int i;
	for (i=0; i<this->taille; i++)
		cout << "     ";
	//cout << numero;
}

void Section::afficher_hautSection()
{
	int i;
	if (this->feuSignalisationTramway != NULL)
			cout << "|";
	for(i=0;i<this->taille;i++){
		if (typeid(*this->ligne[i]) == typeid(Station))
		{
			this->ligne[i]->afficher();
		}else
		{
			if(this->ligne[i]->contientRame())
				cout << "  T  ";
			else
				cout << "     ";
		}
	}
	//cout << numero;

}

void Section::afficher_basSection()
{
	int i;
	if (this->feuSignalisationTramway != NULL)
		cout << "=";
	for(i=0;i<this->taille;i++){
		if (typeid(*this->ligne[i]) != typeid(Station))
				this->ligne[i]->afficher();
		else
			cout << "=====";
	}
	//cout << numero;
}

void Section::setNumero(int n){
	this->numero = n;
}

int Section::getNumero(){
	return this->numero;
}

Element* Section::operator [] (int place){
	return this->ligne[place];
}

Element* Section::getElement(int position){
	return this->ligne[position];
}

//Renvoie l'élément situé à l'emplacement situé après la position donnée
Element * Section::emplacementSuivant(int position, int vitesse, bool * memeSection){
	position+=vitesse;
	if (position >= this->taille){
		//TODO On demande à la ligne, et on initialise nouvelleSection à la nouvelle Section.
		cout << "Fin de section" << endl;
		cout << "Numero actuel : " << this->numero << endl;
		*memeSection = false;

		// On retourne quand meme le premier element de la prochaine section.
		position = position%this->taille;
		int tailleSectionSuivante = this->lt->getSection(this->numero+1)->taille;
		if(position < tailleSectionSuivante){
			return this->lt->getSection(this->numero+1)->getElement(position);
		}
		else{
			position-=tailleSectionSuivante;
			return this->lt->getSection(this->numero+2)->getElement(position);
		}

	} else {
		cout << "Position trouvée : " << position << endl;
		*memeSection = true;
		return this->ligne[position];
	}
}

LigneTramway * Section::getLigneTramway(){
	return this->lt;
}

void Section::setLigneTramway(LigneTramway * l){
	this->lt = l;
}

void Section::ajouterElementSection(Element* element,const int place){
	this->ligne[place] = element;
	element->setNumero(place);
	cout << "*** Element ajouté en place " << place << " ***" << endl;
}

// Ajoute le feu passé en paramètre à la section courante
void Section::setFeuSignalisation(FeuSignalisationTramway * feu) {
	this->feuSignalisationTramway = feu;
	cout << "Feu de signalisation pour Tramway ajouté à la section n°'" << this->getNumero() << "'." << endl;
}

// Retourne un pointeur sur le feu de signalisation de la section courante
FeuSignalisationTramway * Section::getFeuSignalisation() const {
	return this->feuSignalisationTramway;
}

// Retour la taille de la section courante
int Section::getTaille() const {
	return this->taille;
}

Section::~Section() {
	// TODO Auto-generated destructor stub
}
